package cn.stuManagement.student;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import javax.print.attribute.Size2DSyntax;

import cn.stum.util.SysIntial;

public class Student implements Serializable{

	/**
	 * 序列化ID
	 */
	private static final long serialVersionUID = 1L;
	// 学生信息 ：编号，密码，姓名，性别，年龄，电话，地址
	private String userID;// 编号
	private String userPw;// 密码
	private String userName;// 姓名
	private Integer userGender;// 性别 ，0为女，1为男
	private Integer userAge;// 年龄
	private String userTel;// 电话
	private String userAddress;// 地址
	private Integer userLevel;// 用户等级，0为学生，1为老师
	private String beFriend;

	// {
	// List<Map<String, Object>> listOthers = setListOthers(lists, listf);
	// List<Map<String, Object>> messBoard = new ArrayList<>();
	// }

	/**
	 * @param userID
	 * @param userPw
	 * @param userName
	 * @param userGender
	 * @param userAge
	 * @param userTel
	 * @param userAddress
	 * @param userLevel
	 */
	public Student(String userID, String userPw, String userName, Integer userGender, Integer userAge, String userTel,
			String userAddress, Integer userLevel) {
		super();
		this.userID = userID;
		this.userPw = userPw;
		this.userName = userName;
		this.userGender = userGender;
		this.userAge = userAge;
		this.userTel = userTel;
		this.userAddress = userAddress;
		this.userLevel = userLevel;

	}

	// 回复留言
	public boolean replyMessage(String stuID, String content, List<Message> listm) {
		// 发送成功标志位
		boolean sended = false;
		// 创建留言对象
		Message mes = new Message();

		// 判断长度是否增加的变量
		int listm0 = listm.size();
		int listm1;
		// 设置留言具体内容
		mes.setFromID(this.getUserID());
		mes.setToID(stuID);
		mes.setDate(new Date(System.currentTimeMillis()));
		mes.setMessageID(String.valueOf(System.currentTimeMillis() + 10));
		mes.setContent(content);
		mes.setState("reply");
		listm.add(mes);

		// 添加留言后的长度
		listm1 = listm.size();
		if (listm1 == listm0 + 1) {
			sended = true;
		} else {
			sended = false;
		}

		// 返回值
		return sended;
	}

	// 发送留言
	public boolean sendMessage(String stuID, String content, List<Message> listm) {
		// 发送成功标志位
		boolean sended = false;
		// 创建留言对象
		Message mes = new Message();

		// 判断长度是否增加的变量
		int listm0 = listm.size();
		int listm1;

		// 设置留言具体内容
		mes.setFromID(this.getUserID());
		mes.setToID(stuID);
		mes.setDate(new Date(System.currentTimeMillis()));
		mes.setMessageID(String.valueOf(System.currentTimeMillis() + 10));
		mes.setContent(content);
		mes.setState("send");
		listm.add(mes);

		// 添加留言后的长度
		listm1 = listm.size();
		if (listm1 == listm0 + 1) {
			sended = true;
		} else {
			sended = false;
		}

		// 返回值
		return sended;
	}
	////////////////////////////////////////////////////////////////////

	// 获取所有留言信息----检查留言板的方法
	public List<Map<String, Object>> getmb(List<Message> listm, List<Student> lists) {
		// 实例化留言板对象
		List<Map<String, Object>> listboard = new ArrayList<>();

		// 标志位

		// 遍历留言列表
		for (Message mes : listm) {

			// if (mes.getToID().equals(this.getUserID())) {
			// // 如果我是收件人

			System.out.println("发送时间" + mes.getDate() + "来自：" + mes.getFromID() + "内容：" + mes.getContent());
			// 转存的map集合
			Map<String, Object> mapmessage = new LinkedHashMap<>();
			mapmessage.put("留言状态", "收到的留言");
			mapmessage.put("发送时间:", mes.getDate());
			mapmessage.put("来自:", mes.getFromID());
			mapmessage.put("留言内容：", mes.getContent());
			listboard.add(mapmessage);

			// } else if (mes.getFromID().equals(this.getUserID())) {
			// // 如果我是发件人
			//
			// mapmessage.put("留言状态", "发送的留言");
			// mapmessage.put("发送时间:", mes.getDate());
			// mapmessage.put("发送至:", mes.getToID());
			// mapmessage.put("留言内容：", mes.getContent());
			// listboard.add(mapmessage);
			//
			// }
			//
		}
		//

		if (listboard == null || listboard.size() == 0) {
			return null;
		} else {
			// 返回留言链表
			return listboard;
		}
	}

	///////////////////////////////////////////////////////////////////////

	// 获取留言板信息
	public List<Map<String, Object>> getMessageBoard(List<Message> listm, List<Student> lists) {
		// 实例化留言板对象
		List<Map<String, Object>> listboard = new ArrayList<>();
		// 接收对方的姓名
		List<Student> opposite = new ArrayList<>();
		Student stu0 = new Student();

		// 查找对方姓名
		Map<String, Object> mapFriend = new LinkedHashMap<>();
		// 遍历留言列表
		for (Message mes : listm) {
			// 如果是发给自己的
			if (mes.getToID().equals(this.getUserID())) {
				// 如果我是收件人
				//System.out.println("*********我是收件人");
				mapFriend.put("userID", mes.getFromID());
				opposite = SysIntial.listCondition(lists, mapFriend);
				if (opposite.size() == 1) {
					for (Student student : opposite) {
						// 转存的map集合
						Map<String, Object> mapmessage = new LinkedHashMap<>();
						mapmessage.put("留言状态", "收到的留言");
						mapmessage.put("发送时间:", mes.getDate());
						mapmessage.put("来自:", student.getUserName());
						mapmessage.put("留言内容：", mes.getContent());
						listboard.add(mapmessage);
					}
				} else {
					System.out.println("ID重复，请联系老师处理");
					break;
				}

			} else if (mes.getFromID().equals(this.getUserID())) {
				//System.out.println("*******************8我是发件人");
				// 如果我是发件人
				mapFriend.put("userID", mes.getToID());
				opposite = SysIntial.listCondition(lists, mapFriend);
				if (opposite.size() == 1) {
					for (Student student : opposite) {
						// 转存的map集合
						Map<String, Object> mapmessage = new LinkedHashMap<>();
						mapmessage.put("留言状态", "发送的留言");
						mapmessage.put("发送时间:", mes.getDate());
						mapmessage.put("发送至:", student.getUserName());
						mapmessage.put("留言内容：", mes.getContent());
						listboard.add(mapmessage);
					}
				} else {
					System.out.println("ID重复，请联系老师处理");
					break;
				}
			}

		}
		if (listboard == null || listboard.size() == 0) {
			return null;
		} else {
			// 返回留言链表
			return listboard;
		}
	}

	// 修改好友备注
	public boolean updateComment(String stuID, String comment, List<Friend> listf) {
		// 修改成功标志位
		boolean isUpdate = false;
		// 好友关系标志
		boolean isFriend = false;

		// 先判断是否存在好友关系
		for (Friend friend : listf) {
			if (friend.getUserID().equals(this.getUserID()) && friend.getFriendID().equals(stuID)) {
				friend.setComment(comment);
				;
				isUpdate = true;
				isFriend = true;
				break;
			}
		}
		// 判断是否是好友关系
		if (!isFriend) {
			System.out.println("不是好友，不能添加备注");

		}

		return isUpdate;

	}

	// 删除好友
	public boolean removeFriend(String stuID, List<Friend> listf) {
		// 获取之前好友链表长度
		int listf0 = listf.size();
		// 获取添加之后的链表长度
		int listf1;
		// 删除成功标志位
		boolean removes = false;
		// 要删除的好友关系在不在listf中
		boolean inList = false;
		// 判断 this 和 stuID在friend列表中么
		// 如果在，查看beFriend ，设置“N”
		// 如果不在，输出不是好友
		for (Friend friend : listf) {
			if (friend.getUserID().equals(this.getUserID()) && friend.getFriendID().equals(stuID)) {
				friend.setBeFriend("N");
				removes = true;
				inList = true;
				break;
			}

		}
		if (inList == false) {
			System.out.println("不是好友关系未删除");
			removes = false;
			
		}
		listf1 = listf.size();

		return removes;

	}

	// 增加好友
	public boolean addFriend(String stuID, String comment, List<Friend> listf) {

		// 获取之前好友链表长度
		int listf0 = listf.size();
		// 获取添加之后的链表长度
		int listf1;
		// 添加成功标志位
		boolean adds = true;
		// 要添加的好友关系在不在listf中
		boolean inList = false;
		// 判断 this 和 stuID在friend列表中么
		// 如果在，查看beFriend ，设置“Y”
		// 如果不在，新建Friend对象
		for (Friend friend : listf) {
			if (friend.getUserID().equals(this.getUserID()) && friend.getFriendID().equals(stuID)) {
				friend.setBeFriend("Y");
				adds = true;
				inList = true;
			}

		}
		if (inList == false) {
			// 新建好友关系
			Friend f1 = new Friend();
			// 设置关系编码
			f1.setRelevanceID(this.getUserID() + stuID);
			// 设置用户id
			f1.setUserID(this.getUserID());
			// 设置好友id
			f1.setFriendID(stuID);
			// 设置好友备注
			f1.setComment(comment);
			// 设置好友备注
			f1.setBeFriend("Y");
			listf.add(f1);
			// 添加之后的链表长度
			listf1 = listf.size();
			// 判断长度有没有增加
			if (listf1 == listf0 + 1) {
				adds = true;
			} else {
				adds = false;
			}

		}
		// 返回添加成功
		return adds;

	}

	// 显示好友信息列表
	public List<Map<String, Object>> getFriendList(List<Student> lists, List<Friend> listf) {

		List<Map<String, Object>> listo = new ArrayList<>();
		// 定义标志位
		boolean matchflag = true;
		// 遍历同学信息表，将除了密码的信息复制到新的链表中
		for (Student stu0 : lists) {
			// 如果不是用户自己
			if (stu0 != this) {
				// 将基本信息天道others的链表中
				Map<String, Object> map1 = new LinkedHashMap<>();

				matchflag = true;
				if (listf != null) {
					for (Friend fri : listf) {
						if (matchflag) {
							if (this.getUserID().equals(fri.getUserID())
									&& (stu0.getUserID().equals(fri.getFriendID()))) {
								//System.out.println(fri.getBeFriend());
								map1.put("ID", stu0.getUserID());
								map1.put("备注", fri.getComment());
								map1.put("姓名", stu0.getUserName());
								map1.put("性别", stu0.getUserGender());
								map1.put("年龄", stu0.getUserAge());
								map1.put("电话", stu0.getUserTel());
								map1.put("地址", stu0.getUserAddress());
								matchflag = false;
								// System.out.println(map1);
								listo.add(map1);

							}
						}
					}
				}

			}
		}
		return listo;
	}

	// 输出同学信息
	public List<Map<String, Object>> setListOthers(List<Student> lists, List<Friend> listf) {

		List<Map<String, Object>> listo = new ArrayList<>();
		// 定义标志位
		boolean matchflag = true;
		// 遍历同学信息表，将除了密码的信息复制到新的链表中
		for (Student stu0 : lists) {
			// 如果不是用户自己
			if (stu0 != this) {
				// 将基本信息天道others的链表中
				Map<String, Object> map1 = new LinkedHashMap<>();
				map1.put("ID", stu0.getUserID());
				map1.put("姓名", stu0.getUserName());
				map1.put("性别", stu0.getUserGender());
				map1.put("年龄", stu0.getUserAge());
				map1.put("电话", stu0.getUserTel());
				map1.put("地址", stu0.getUserAddress());

				matchflag = true;
				if (listf != null) {
					for (Friend fri : listf) {
						if (matchflag) {
							// System.out.println("stuID:"+stu0.getUserID()+"\tfriendID:"+fri.getFriendID()
							// +"\tstu0.getUserID().equals(fri.getFriendID()):"+(stu0.getUserID().equals(fri.getFriendID()))
							// +"this.getUserID().equals(fri.getUserID())"+(this.getUserID().equals(fri.getUserID())));
							if (this.getUserID().equals(fri.getUserID())
									&& (stu0.getUserID().equals(fri.getFriendID()))) {
								// System.out.println(fri.getBeFriend());
								map1.put("是好友", fri.getBeFriend());
								matchflag = false;

							} else {
								map1.put("是好友", "X");
							}
						}
					}
				}
				// System.out.println(map1);
				listo.add(map1);
			}
		}
		return listo;
	}

	// 输出留言板信息
	public void printmb(List<Map<String, Object>> listmb) {
		if (listmb == null) {
			System.out.println("留言板为空");
		} else {
			for (Map<String, Object> map : listmb) {

				Set<Entry<String, Object>> set1 = map.entrySet();
				for (Entry<String, Object> entry : set1) {
					System.out.println(entry);
				}
			}
		}
	}

	// 输出同学信息
	public void printOther(List<Map<String, Object>> listOthers) {
		boolean flag = true;
		// 测试的时候输出，运行的时候不输出

		for (Map<String, Object> user : listOthers) {
			Set<Map.Entry<String, Object>> uss = user.entrySet();
			if (flag == true) {
				for (Entry<String, Object> entry : uss) {
					System.out.print(entry.getKey() + "\t");
				}
				System.out.println();
				flag = false;
			}
			for (Entry<String, Object> entry : uss) {
				System.out.print(entry.getValue() + "\t");
			}
			System.out.println();

		}
	}

	// 输出用户信息
	public void printMessage() {
		System.out.println("编号：" + this.getUserID() + "密码：" + this.getUserPw() + "姓名：" + this.getUserName() + "性别："
				+ this.getUserGender() + "年龄：" + this.getUserAge() + "电话：" + this.getUserTel() + "地址："
				+ this.getUserAddress());
	}

	/**
	 * 无参的构造方法
	 */
	public Student() {
		super();
		// TODO Auto-generated constructor stub
	}

	// 重写toString方法

	// getters& setters
	public String getUserID() {
		return userID;
	}

	@Override
	public String toString() {
		return "Student [userID=" + userID + ", userPw=" + userPw + ", userName=" + userName + ", userGender="
				+ userGender + ", userAge=" + userAge + ", userTel=" + userTel + ", userAddress=" + userAddress
				+ ", userLevel=" + userLevel + "]";
	}

	public void setUserID(String userID) {
		this.userID = userID;
	}

	public String getUserPw() {
		return userPw;
	}

	public void setUserPw(String userPw) {
		this.userPw = userPw;
	}

	public String getUserName() {
		return userName;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}

	public Integer getUserGender() {
		return userGender;
	}

	public void setUserGender(Integer userGender) {
		this.userGender = userGender;
	}

	public int getUserAge() {
		return userAge;
	}

	public void setUserAge(int userAge) {
		this.userAge = userAge;
	}

	public String getUserTel() {
		return userTel;
	}

	public void setUserTel(String userTel) {
		this.userTel = userTel;
	}

	public String getUserAddress() {
		return userAddress;
	}

	public void setUserAddress(String userAddress) {
		this.userAddress = userAddress;
	}

}
